﻿Imports FairShop
Imports FairShop.Objects
Imports FairShop.Operaties
Imports FairShop.Presenters
Imports Microsoft.VisualStudio.TestTools.UnitTesting
Imports System
Imports System.Collections.Generic

<TestClass()> _
Public Class TestLeveringsbonScenarios

    Private testContextInstance As TestContext

    Private _dsVoor As ArtikelsDataSet
    Private _artikelRij As ArtikelsDataSet.ArtikelsRow
    Private _verkoopRij As ArtikelsDataSet.VerkopenRow
    Private Shared _artikelsAdapter As ArtikelsDataSetTableAdapters.ArtikelsTableAdapter
    Private Shared _verkopenAdapter As ArtikelsDataSetTableAdapters.VerkopenTableAdapter
    Private Shared _verkoopsDetailsAdapter As New ArtikelsDataSetTableAdapters.VerkoopsDetailsTableAdapter

    '''<summary>
    '''Gets or sets the test context which provides
    '''information about and functionality for the current test run.
    '''</summary>
    Public Property TestContext() As TestContext
        Get
            Return testContextInstance
        End Get
        Set(ByVal value As TestContext)
            testContextInstance = value
        End Set
    End Property

#Region "Additional test attributes"
    '
    ' You can use the following additional attributes as you write your tests:
    '
    ' Use ClassInitialize to run code before running the first test in the class
    <ClassInitialize()> _
    Public Shared Sub MyClassInitialize(ByVal testContext As TestContext)
        _artikelsAdapter = New ArtikelsDataSetTableAdapters.ArtikelsTableAdapter
        _verkopenAdapter = New ArtikelsDataSetTableAdapters.VerkopenTableAdapter
        _verkoopsDetailsAdapter = New ArtikelsDataSetTableAdapters.VerkoopsDetailsTableAdapter
    End Sub
    '
    ' Use ClassCleanup to run code after all tests in a class have run
    ' <ClassCleanup()> Public Shared Sub MyClassCleanup()
    ' End Sub
    '
    ' Use TestInitialize to run code before running each test
    <TestInitialize()> _
    Public Sub MyTestInitialize()
        ' maak een standaard kasbladverkoop aan (gebruik een bestaande verkoop)
        _verkoopRij = Utility.Data.Verkopen(0)
        _artikelRij = Utility.Data.Artikels(0)
        VerkoopsdetailsCleanUp()

        ' gebruik een aparte dataset, niet Utility.Data, zodat we zeker zijn dat het de echte waarden uit de db zijn
        _dsVoor = New ArtikelsDataSet()
        _artikelsAdapter.Fill(_dsVoor.Artikels)
        _verkopenAdapter.Fill(_dsVoor.Verkopen)
        _verkoopsDetailsAdapter.FillByIdVerkoop(_dsVoor.VerkoopsDetails, _verkoopRij.Id)
    End Sub
    '
    ' Use TestCleanup to run code after each test has run
    <TestCleanup()> _
    Public Sub MyTestCleanup()
        Utility.ResetData()  ' zodat eventuele overgebleven wijzigingen niet doorgaat naar andere tests
    End Sub

#End Region

    <TestMethod()> _
    Public Sub GewoneVerkoopTest()
        ' Arrange
        Dim stockVoor As Integer = _artikelRij.VerwachteVoorraad
        Dim detailsVoor As Integer = _verkoopRij.GetVerkoopsDetailsRows.Count

        ' Act
        Dim aantalVerkocht As Integer = 2
        Dim presenter As New VerkoopDetailsPresenter(Nothing, _verkoopRij)
        presenter.ToevoegenVerkoopsDetail(_verkoopRij, _artikelRij, 2.5, "", aantalVerkocht)
        Dal.VerkoopsDetailsBewaren(_verkoopRij.GetVerkoopsDetailsRows())
        presenter.KlantAfrekenen()

        ' Assert
        Dim dsNa As New ArtikelsDataSet()
        _artikelsAdapter.FillById(dsNa.Artikels, _artikelRij.Id)
        _verkopenAdapter.FillById(dsNa.Verkopen, _verkoopRij.Id)
        _verkoopsDetailsAdapter.FillByIdVerkoop(dsNa.VerkoopsDetails, _verkoopRij.Id)
        Dim stockNa As Integer = dsNa.Artikels(0).VerwachteVoorraad
        Dim detailsNa As Integer = dsNa.Verkopen(0).GetVerkoopsDetailsRows.Count
        Assert.AreEqual(stockVoor - aantalVerkocht, stockNa)
        Assert.AreEqual(detailsVoor + 1, detailsNa)
    End Sub

    <TestMethod()> _
    Public Sub NieuweLeveringsbonBestaandeKlantTerugbrengenTest()
        ' Arrange
        Dim stockVoor As Integer = _artikelRij.VerwachteVoorraad
        Dim detailsVoor As Integer = _verkoopRij.GetVerkoopsDetailsRows.Count
        Dim consignatie As Boolean = True

        ' Act
        Dim aantalVerkocht As Integer = 2
        Dim presenter As New VerkoopDetailsPresenter(Nothing, _verkoopRij)
        presenter.ToevoegenVerkoopsDetail(_verkoopRij, _artikelRij, 2.5, "", aantalVerkocht)
        Dim idVerkoopLeveringsbon As Integer = _
            presenter.VerkoopsDetailsBewarenBijNieuweLeveringsbon( _
                    Constants.DEFAULT_KLANT_ID, "Testverkoop", Constants.DEFAULT_WINKELIER_ID, consignatie)

        ' Assert
        Dim dsNa As New ArtikelsDataSet()
        _artikelsAdapter.FillById(dsNa.Artikels, _artikelRij.Id)
        _verkopenAdapter.Fill(dsNa.Verkopen)
        _verkoopsDetailsAdapter.Fill(dsNa.VerkoopsDetails)
        Dim stockNa As Integer = dsNa.Artikels(0).VerwachteVoorraad
        Dim kasbladVerkoopNa As ArtikelsDataSet.VerkopenRow = dsNa.Verkopen.FindById(_verkoopRij.Id)
        Dim detailsVerkoopNa As Integer = kasbladVerkoopNa.GetVerkoopsDetailsRows.Count
        Dim leveringsbonVerkoopNa As ArtikelsDataSet.VerkopenRow = dsNa.Verkopen.FindById(idVerkoopLeveringsbon)
        Dim detailsLeveringsbon As Integer = leveringsbonVerkoopNa.GetVerkoopsDetailsRows.Count
        Assert.AreEqual(stockVoor - aantalVerkocht, stockNa)
        Assert.AreEqual(detailsVoor, detailsVerkoopNa)
        Assert.AreEqual(1, detailsLeveringsbon)
        Assert.AreEqual(consignatie, leveringsbonVerkoopNa.Consignatie)
    End Sub

    <TestMethod()> _
    Public Sub NieuweLeveringsbonBestaandeKlantNietTerugbrengenTest()
        ' Arrange
        Dim stockVoor As Integer = _artikelRij.VerwachteVoorraad
        Dim detailsVoor As Integer = _verkoopRij.GetVerkoopsDetailsRows.Count
        Dim consignatie As Boolean = False

        ' Act
        Dim aantalVerkocht As Integer = 2
        Dim presenter As New VerkoopDetailsPresenter(Nothing, _verkoopRij)
        presenter.ToevoegenVerkoopsDetail(_verkoopRij, _artikelRij, 2.5, "", aantalVerkocht)
        Dim idVerkoopLeveringsbon As Integer = _
            presenter.VerkoopsDetailsBewarenBijNieuweLeveringsbon( _
                    Constants.DEFAULT_KLANT_ID, "Testverkoop", Constants.DEFAULT_WINKELIER_ID, consignatie)

        ' Assert
        Dim dsNa As New ArtikelsDataSet()
        _artikelsAdapter.FillById(dsNa.Artikels, _artikelRij.Id)
        _verkopenAdapter.Fill(dsNa.Verkopen)
        _verkoopsDetailsAdapter.Fill(dsNa.VerkoopsDetails)
        Dim stockNa As Integer = dsNa.Artikels(0).VerwachteVoorraad
        Dim kasbladVerkoopNa As ArtikelsDataSet.VerkopenRow = dsNa.Verkopen.FindById(_verkoopRij.Id)
        Dim detailsVerkoopNa As Integer = kasbladVerkoopNa.GetVerkoopsDetailsRows.Count
        Dim leveringsbonVerkoopNa As ArtikelsDataSet.VerkopenRow = dsNa.Verkopen.FindById(idVerkoopLeveringsbon)
        Dim detailsLeveringsbon As Integer = leveringsbonVerkoopNa.GetVerkoopsDetailsRows.Count
        Assert.AreEqual(stockVoor - aantalVerkocht, stockNa)
        Assert.AreEqual(detailsVoor, detailsVerkoopNa)
        Assert.AreEqual(1, detailsLeveringsbon)
        Assert.AreEqual(consignatie, leveringsbonVerkoopNa.Consignatie)
    End Sub

    <TestMethod()> _
    Public Sub NieuweLeveringsbonBestaandeKlantMetKortingNietTerugbrengenTest()
        ' Arrange
        Dim stockVoor As Integer = _artikelRij.VerwachteVoorraad
        Dim detailsVoor As Integer = _verkoopRij.GetVerkoopsDetailsRows.Count
        Dim consignatie As Boolean = False

        ' Act
        Dim aantalVerkocht As Integer = 2
        Dim presenter As New VerkoopDetailsPresenter(Nothing, _verkoopRij)
        presenter.ToevoegenVerkoopsDetail(_verkoopRij, _artikelRij, 2.5, "", aantalVerkocht)
        Dim idVerkoopLeveringsbon As Integer = _
            presenter.VerkoopsDetailsBewarenBijNieuweLeveringsbon( _
                    Constants.DEFAULT_KLANT_ID_MET_KORTING, "Testverkoop", Constants.DEFAULT_WINKELIER_ID, consignatie)

        ' Assert
        Dim dsNa As New ArtikelsDataSet()
        _artikelsAdapter.FillById(dsNa.Artikels, _artikelRij.Id)
        _verkopenAdapter.Fill(dsNa.Verkopen)
        _verkoopsDetailsAdapter.Fill(dsNa.VerkoopsDetails)
        Dim stockNa As Integer = dsNa.Artikels(0).VerwachteVoorraad
        Dim kasbladVerkoopNa As ArtikelsDataSet.VerkopenRow = dsNa.Verkopen.FindById(_verkoopRij.Id)
        Dim detailsVerkoopNa As Integer = kasbladVerkoopNa.GetVerkoopsDetailsRows.Count
        Dim leveringsbonVerkoopNa As ArtikelsDataSet.VerkopenRow = dsNa.Verkopen.FindById(idVerkoopLeveringsbon)
        Dim detailsLeveringsbon As Integer = leveringsbonVerkoopNa.GetVerkoopsDetailsRows.Count
        Assert.AreEqual(stockVoor - aantalVerkocht, stockNa)
        Assert.AreEqual(detailsVoor, detailsVerkoopNa)
        Assert.AreEqual(1, detailsLeveringsbon)
        Assert.AreEqual(consignatie, leveringsbonVerkoopNa.Consignatie)
    End Sub

    <TestMethod()> _
    Public Sub BestaandeLeveringsbonTerugbrengenTest()
        ' Arrange
        Dim stockVoor As Integer = _artikelRij.VerwachteVoorraad
        Dim detailsKasbladVoor As Integer = _verkoopRij.GetVerkoopsDetailsRows.Count
        Dim consignatie As Boolean = True

        ' neem de eerste leveringsbon die je kan vinden en die nog openstaat
        Dim query As IEnumerable(Of ArtikelsDataSet.VerkopenRow) = From v In Utility.Data.Verkopen _
                                        Where v.IsFactuurBehandeld = False _
                                        And v.IdSoort = Constants.VerkoopsoortIds.FACTUUR _
                                        Select v
        If (Not query.Any) Then
            Assert.Inconclusive("Geen openstaande leveringsbon gevonden om mee te testen")
        End If

        Dim leveringsbonRij As ArtikelsDataSet.VerkopenRow = query.FirstOrDefault
        Dim detailsLeveringsbonVoor As Integer = leveringsbonRij.GetVerkoopsDetailsRows.Count

        For Each detail In _verkoopRij.GetVerkoopsDetailsRows
            detail.Status = StatusImage.Afgerekend
        Next
        Utility.Data.AcceptChanges()

        ' Act
        Dim aantalVerkocht As Integer = 2
        Dim presenter As New VerkoopDetailsPresenter(Nothing, _verkoopRij)
        presenter.ToevoegenVerkoopsDetail(_verkoopRij, _artikelRij, 2.5, "", aantalVerkocht)

        presenter.VerkoopsDetailsBewarenBijBestaandeLeveringsbon(leveringsbonRij.Id, consignatie)

        ' Assert
        Dim dsNa As New ArtikelsDataSet()
        _artikelsAdapter.FillById(dsNa.Artikels, _artikelRij.Id)
        _verkopenAdapter.Fill(dsNa.Verkopen)
        _verkoopsDetailsAdapter.Fill(dsNa.VerkoopsDetails)
        Dim stockNa As Integer = dsNa.Artikels(0).VerwachteVoorraad
        Dim kasbladVerkoopNa As ArtikelsDataSet.VerkopenRow = dsNa.Verkopen.FindById(_verkoopRij.Id)
        Dim detailsKasbladNa As Integer = kasbladVerkoopNa.GetVerkoopsDetailsRows.Count
        Dim leveringsbonVerkoopNa As ArtikelsDataSet.VerkopenRow = dsNa.Verkopen.FindById(leveringsbonRij.Id)
        Dim detailsLeveringsbon As Integer = leveringsbonVerkoopNa.GetVerkoopsDetailsRows.Count
        Assert.AreEqual(stockVoor - aantalVerkocht, stockNa, "Voorraad klopt niet")
        Assert.AreEqual(detailsKasbladVoor, detailsKasbladNa, "Aantal details op het kasblad klopt niet")
        Assert.AreEqual(detailsLeveringsbonVoor + 1, detailsLeveringsbon, "Aantal details op de leveringsbon klopt niet")
        Assert.AreEqual(consignatie, leveringsbonVerkoopNa.Consignatie)
    End Sub

    <TestMethod()> _
    Public Sub BestaandeLeveringsbonNietTerugbrengenTest()
        ' Arrange
        Dim stockVoor As Integer = _artikelRij.VerwachteVoorraad
        Dim detailsKasbladVoor As Integer = _verkoopRij.GetVerkoopsDetailsRows.Count
        Dim consignatie As Boolean = False

        ' neem de eerste leveringsbon die je kan vinden en die nog openstaat
        Dim query As IEnumerable(Of ArtikelsDataSet.VerkopenRow) = From v In Utility.Data.Verkopen _
                                        Where v.IsFactuurBehandeld = False _
                                        And v.IdSoort = Constants.VerkoopsoortIds.FACTUUR _
                                        Select v
        If (Not query.Any) Then
            Assert.Inconclusive("Geen openstaande leveringsbon gevonden om mee te testen")
        End If

        Dim leveringsbonRij As ArtikelsDataSet.VerkopenRow = query.FirstOrDefault
        Dim detailsLeveringsbonVoor As Integer = leveringsbonRij.GetVerkoopsDetailsRows.Count

        For Each detail In _verkoopRij.GetVerkoopsDetailsRows
            detail.Status = StatusImage.Afgerekend
        Next
        _dsVoor.AcceptChanges()

        ' Act
        Dim aantalVerkocht As Integer = 2
        Dim presenter As New VerkoopDetailsPresenter(Nothing, _verkoopRij)
        presenter.ToevoegenVerkoopsDetail(_verkoopRij, _artikelRij, 2.5, "", aantalVerkocht)

        presenter.VerkoopsDetailsBewarenBijBestaandeLeveringsbon(leveringsbonRij.Id, consignatie)

        ' Assert
        Dim dsNa As New ArtikelsDataSet()
        _artikelsAdapter.FillById(dsNa.Artikels, _artikelRij.Id)
        _verkopenAdapter.Fill(dsNa.Verkopen)
        _verkoopsDetailsAdapter.Fill(dsNa.VerkoopsDetails)
        Dim stockNa As Integer = dsNa.Artikels(0).VerwachteVoorraad
        Dim kasbladVerkoopNa As ArtikelsDataSet.VerkopenRow = dsNa.Verkopen.FindById(_verkoopRij.Id)
        Dim detailsKasbladNa As Integer = kasbladVerkoopNa.GetVerkoopsDetailsRows.Count
        Dim leveringsbonVerkoopNa As ArtikelsDataSet.VerkopenRow = dsNa.Verkopen.FindById(leveringsbonRij.Id)
        Dim detailsLeveringsbon As Integer = leveringsbonVerkoopNa.GetVerkoopsDetailsRows.Count
        Assert.AreEqual(stockVoor - aantalVerkocht, stockNa, "Voorraad klopt niet")
        Assert.AreEqual(detailsKasbladVoor, detailsKasbladNa, "Aantal details op het kasblad klopt niet")
        Assert.AreEqual(detailsLeveringsbonVoor + 1, detailsLeveringsbon, "Aantal details op de leveringsbon klopt niet")
        Assert.AreEqual(consignatie, leveringsbonVerkoopNa.Consignatie)
    End Sub

    <TestMethod()> _
    Public Sub BestaandeLeveringsbonNietTerugbrengenMetGepauzeerdeKlantTest()
        ' Arrange
        Dim stockVoor As Integer = _artikelRij.VerwachteVoorraad
        Dim detailsKasbladVoor As Integer = _verkoopRij.GetVerkoopsDetailsRows.Count
        Dim consignatie As Boolean = False

        ' neem de eerste leveringsbon die je kan vinden en die nog openstaat
        Dim query As IEnumerable(Of ArtikelsDataSet.VerkopenRow) = From v In Utility.Data.Verkopen _
                                        Where v.IsFactuurBehandeld = False _
                                        And v.IdSoort = Constants.VerkoopsoortIds.FACTUUR _
                                        Select v
        If (Not query.Any) Then
            Assert.Inconclusive("Geen openstaande leveringsbon gevonden om mee te testen")
        End If

        Dim leveringsbonRij As ArtikelsDataSet.VerkopenRow = query.FirstOrDefault
        Dim detailsLeveringsbonVoor As Integer = leveringsbonRij.GetVerkoopsDetailsRows.Count

        For Each detail In _verkoopRij.GetVerkoopsDetailsRows
            detail.Status = StatusImage.Afgerekend
        Next
        _dsVoor.AcceptChanges()

        ' Act
        Dim aantalGepauzeerd As Integer = 5
        Dim aantalVerkocht As Integer = 2
        Dim presenter As New VerkoopDetailsPresenter(Nothing, _verkoopRij)
        presenter.ToevoegenVerkoopsDetail(_verkoopRij, _artikelRij, 2.5, "", aantalGepauzeerd)
        presenter.KlantInOfUitWachtZetten()
        presenter.ToevoegenVerkoopsDetail(_verkoopRij, _artikelRij, 2.5, "", aantalVerkocht)

        presenter.VerkoopsDetailsBewarenBijBestaandeLeveringsbon(leveringsbonRij.Id, consignatie)

        ' Assert
        Dim dsNa As New ArtikelsDataSet()
        _artikelsAdapter.FillById(dsNa.Artikels, _artikelRij.Id)
        _verkopenAdapter.Fill(dsNa.Verkopen)
        _verkoopsDetailsAdapter.Fill(dsNa.VerkoopsDetails)
        Dim stockNa As Integer = dsNa.Artikels(0).VerwachteVoorraad
        Dim kasbladVerkoopNa As ArtikelsDataSet.VerkopenRow = dsNa.Verkopen.FindById(_verkoopRij.Id)
        Dim detailsKasbladNa As Integer = kasbladVerkoopNa.GetVerkoopsDetailsRows.Count
        Dim leveringsbonVerkoopNa As ArtikelsDataSet.VerkopenRow = dsNa.Verkopen.FindById(leveringsbonRij.Id)
        Dim detailsLeveringsbon As Integer = leveringsbonVerkoopNa.GetVerkoopsDetailsRows.Count
        Assert.AreEqual(stockVoor - aantalVerkocht, stockNa, "Voorraad klopt niet")
        Assert.AreEqual(detailsKasbladVoor, detailsKasbladNa, "Aantal details op het kasblad klopt niet")
        Assert.AreEqual(detailsLeveringsbonVoor + 1, detailsLeveringsbon, "Aantal details op de leveringsbon klopt niet")
        Assert.AreEqual(consignatie, leveringsbonVerkoopNa.Consignatie)
    End Sub

    <TestMethod()> _
    Public Sub BestaandeLeveringsbonCashBetalenTest()
        ' Arrange
        Dim stockVoor As Integer = _artikelRij.VerwachteVoorraad
        Dim detailsKasbladVoor As Integer = _verkoopRij.GetVerkoopsDetailsRows.Count

        Dim consignatie As Boolean = False
        ' neem de eerste leveringsbon die je kan vinden en die nog openstaat
        Dim query As IEnumerable(Of ArtikelsDataSet.VerkopenRow) = From v In Utility.Data.Verkopen _
                                        Where v.IsFactuurBehandeld = False _
                                        And v.IdSoort = Constants.VerkoopsoortIds.FACTUUR _
                                        Select v
        If (Not query.Any) Then
            Assert.Inconclusive("Geen openstaande leveringsbon gevonden om mee te testen")
        End If

        Dim leveringsbonRij As ArtikelsDataSet.VerkopenRow = query.FirstOrDefault
        Dim detailsLeveringsbonVoor As Integer = leveringsbonRij.GetVerkoopsDetailsRows.Count

        VerkoopsdetailsCleanUp()

        ' Act
        Dim aantalVerkocht As Integer = 2
        Dim presenter As New VerkoopDetailsPresenter(Nothing, _verkoopRij)
        presenter.ToevoegenVerkoopsDetail(_verkoopRij, _artikelRij, 2.5, "", aantalVerkocht)

        presenter.ZetDetailsLeveringsbonOpKasblad(leveringsbonRij.Id, _verkoopRij)
        Dal.VerkoopsDetailsBewaren(_verkoopRij.GetVerkoopsDetailsRows())
        presenter.KlantAfrekenen()

        ' Assert
        Dim dsNa As New ArtikelsDataSet()
        _artikelsAdapter.FillById(dsNa.Artikels, _artikelRij.Id)
        _verkopenAdapter.Fill(dsNa.Verkopen)
        _verkoopsDetailsAdapter.Fill(dsNa.VerkoopsDetails)
        Dim stockNa As Integer = dsNa.Artikels(0).VerwachteVoorraad
        Dim detailsKasbladNa As Integer = dsNa.Verkopen.FindById(_verkoopRij.Id).GetVerkoopsDetailsRows.Count
        Dim detailsLeveringsbonNa As Integer = dsNa.Verkopen.FindById(leveringsbonRij.Id).GetVerkoopsDetailsRows.Count
        Assert.AreEqual(stockVoor - aantalVerkocht, stockNa, "Voorraad klopt niet")
        ' op kasblad is bijgekomen alles van leveringsbon + het pas ingescande artikel
        Assert.AreEqual(detailsKasbladVoor + detailsLeveringsbonVoor + 1, detailsKasbladNa, "Aantal details op het kasblad klopt niet")
        ' op leveringsbon is alles nog eens negatief toegevoegd
        Assert.AreEqual(detailsLeveringsbonVoor * 2, detailsLeveringsbonNa, "Aantal details op de leveringsbon klopt niet")
    End Sub

#Region "Helpers"

    Private Sub VerkoopsdetailsCleanUp()
        For Each detail In Utility.Data.VerkoopsDetails
            detail.Status = StatusImage.Afgerekend
        Next
        Utility.Data.AcceptChanges()
    End Sub

#End Region

End Class
